#pragma once

#include <vector>
#include <memory>
#include <stdexcept>
#include <glm\glm.hpp>

#include "BuilderHelper.h"
#include "Algoritmo2D.h"


class SurfaceBuilder {
public:
	SurfaceBuilder(std::unique_ptr<Algoritmo2D> ptrAlgo2D);
	~SurfaceBuilder();

	// Se cargan los puntos de control
	void addCurvaControl(std::vector< glm::vec3 > vecVertices );

	// Se indica la cantidad de puntos para cada lado de la superficie
	void buildCurva(unsigned int cantPts_U, unsigned int cantPts_V);

	// Obtiene los elementos necesarios para dibujar la superfice
	std::vector< glm::vec3 > getVertices() const;
	std::vector< glm::vec3 > getNormales() const;
	std::vector< unsigned int > getIndexBuffer() const;
	std::vector< glm::vec2 > getCoordenadasTextura() const;

private:
	std::unique_ptr<Algoritmo2D> m_generadorPuntos;

	// Los elementos de la superficie
	std::vector< glm::vec3 > m_vecVertices;
	std::vector< glm::vec3 > m_vecNormales;
	std::vector< unsigned int > m_indexBuffer;
	std::vector< glm::vec2 > m_vecCoordsTextura;

	// Para la construccion de los elementos de la superficie
	BuilderHelper m_helper;
	std::vector< glm::vec3 > buildVertices(unsigned int cantHorizontal, unsigned int cantVertical) const;
};

